package org.zhao.nettydemos.pipeline;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

/**
 * @Auther: xiaohui.zhao
 * @Date: 2021/9/14 16:54
 * @Description: 流水线
 *
 * 一条netty通道需要有很多业务处理器来处理业务 ， 每条通道内部都有一条流水线(Pipeline)把Handler装配起来
 *
 * netty的业务处理器流水线ChannelPipeline是基于责任链设计模式来设计的
 * 内部是一个双向链表结构 ， 能够支持动态地添加和删除业务处理器
 */
@Slf4j
public class InPipeline {


    static class SimpleInHandlerA extends ChannelInboundHandlerAdapter{

        @Override
        public void channelRead(ChannelHandlerContext ctx,Object msg)throws Exception{
            log.info("入站处理器A 被调用");
            super.channelRead(ctx,msg);  // super.channelRead方法的作用是 把当前入站处理器的处理结果传递到下一个入站处理
            // 如果不屌用super.channelRead方法 就表示截断流水线
            // 也可以通过 ctx.fireChannelRead(msg) 来截断水流

        }

    }

    static class SimpleInHandlerB extends ChannelInboundHandlerAdapter{

        @Override
        public void channelRead(ChannelHandlerContext ctx,Object msg)throws Exception{
            log.info("入站处理器B 被调用");
            super.channelRead(ctx,msg);
        }

    }

    static class SimpleInHandlerC extends ChannelInboundHandlerAdapter{

        @Override
        public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception{
            log.info("入站处理器C 被调用");
            super.channelRead(ctx,msg);
        }

    }

}